Для подробного ознакомления лучше прочитать MFC: "Шаг 332 - MFC и синхронизация", MSDN: "Шаг 81 - Что такое семафоры (Semaphore)", API: "Шаг 117 - CreateSemaphore, ReleaseSemaphore".
В MFC для работы с семаформами есть специальный класс CSemaphore. Объявить это класс можно вот так:
CSemaphore semaphore(2,2);
или так:
СSemaphore *semaphore; semaphore = new CSemaphore(2,2);
Второй конструктор нужен для того, чтобы объект можно было помещать в класс, но у него есть параметры и поэтому создавать его нужно будет динамически. Параметры у конструктора такие:
CSemaphore ( LONG lInitialCount = 1, // начальное состояние LONG lMaxCount = 1, // максимальное значение LPCTSTR pstrName = NULL, // имя LPSECURITY_ATTRIBUTES lpsaAttributes = NULL // атрибут защиты );
Используется он так. Объявляется в классе:
class CMyResource
{
private:
СSemaphore *semaphore;
public:
CMyResource();
~CMyResource();
void UseResource();
}
CMyResource::CMyResource()
{
semaphore = new CSemaphore(2,2);
}
CMyResource::~CMyResource()
{
delete semaphore;
}
Теперь в классе есть семафор. Что нужно сделать, чтобы при обращении к ресурсам счетчик работал ? Сказать ему об этом.
void CMyResource::UseResource()
{
CSingleLock singlelock(semaphore);
singlelock.Lock();
......
singlelock.UnLock();
}
В момент обращения к данному объекту класса из разных потоков меняется счетчик. Если вдруг больше трех потоков обратятся к этому объекту, то третий будет дожидаться пока первый и второй освободят ресурс. Например, можно в ресурсы поместить видео файл и обернуть его в такую оболочку. В результате только два потока смогут получить к нему доступ и показать, одновременно я имею в ввиду (не обязательно синхронно), или только в двух окнах.